package cn.kgc.springboot.controller;

import cn.hutool.crypto.SecureUtil;
import cn.kgc.springboot.entity.User;
import cn.kgc.springboot.http.ResponseResult;
import cn.kgc.springboot.service.UserService;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import jakarta.annotation.Resource;
import org.springframework.web.bind.annotation.*;

import java.util.HashMap;
import java.util.List;

/**
 * @author 课工场
 * @date 2025/1/3
 * @description http请求的方式
 * get
 * post
 * delete
 * put
 */
@RestController
@RequestMapping("user")
@CrossOrigin   //  设置当前类中的方法允许跨域访问
public class UserController {

    @Resource
    private UserService userService;

    //  处理get方式的http请求   localhost:9090/kgc/user/list
    @GetMapping("list")
    public ResponseResult userList() {
        return ResponseResult.success().data("tableData", userService.list());
    }

    //  注册请求处理    localhost:9090/kgc/user/register
    @PostMapping("register")
    public ResponseResult registerUser(@RequestBody User user) {

        // 判定用户名是否存在
        String username = user.getUsername();

        // 构建一个根据用户名查询用户信息的查询条件    where username = 'super'
        LambdaQueryWrapper<User> lambda = new QueryWrapper<User>().lambda();
        lambda.eq(User::getUsername, username);
        User usr = userService.getOne(lambda);

        if (ObjectUtils.isNotNull(usr)) {
            return ResponseResult.fail().message("用户名已存在");
        }
        // 密码加密   MD5摘要算法  不可逆算法
        String md5Pwd = SecureUtil.md5(user.getPassword());
        user.setPassword(md5Pwd);

        // 添加数据到数据库
        userService.save(user);

        return ResponseResult.success();
    }

    // 处理登录请求
    @PostMapping("login")
    public ResponseResult login(@RequestBody User user) {

        //  1. 判定用户名是否正确
        String username = user.getUsername();
        // 构建一个根据用户名查询用户信息的查询条件    where username = 'super'
        LambdaQueryWrapper<User> lambda = new QueryWrapper<User>().lambda();
        lambda.eq(User::getUsername, username);
        User usr = userService.getOne(lambda);

        if (ObjectUtils.isNull(usr)) {
            return ResponseResult.fail().message("用户名错误");
        }

        // 2. 判定密码是否正确
        String md5FormPassword = SecureUtil.md5(user.getPassword());  //  明文
        String DBPassword = usr.getPassword();   //  MD5摘要算法的结果  密文

        if (!DBPassword.equals(md5FormPassword)) {
            return ResponseResult.fail().message("密码错误");
        }

        // 3.响应认证通过的结果
        return ResponseResult.success().message("认证通过");

    }

    // 用户信息分页查询
    @PostMapping("page")
    public ResponseResult userPage(@RequestBody HashMap<String, Object> params) {
        // 1. 获取当前页
        Integer page = (Integer) params.get("page");
        // 2. 获取每页显示的条数
        Integer limit = (Integer) params.get("limit");

        // 用户名  搜索关键词
        Object username = params.get("username");
        // 联系方式  搜索关键词
        Object tel = params.get("tel");


        // 分页对象
        Page<User> userPage = new Page<>(page, limit);
        // 构造查询条件
        LambdaQueryWrapper<User> lambda = new QueryWrapper<User>().lambda();
        lambda.like(ObjectUtils.isNotNull(username), User::getUsername, username)
                .like(ObjectUtils.isNotNull(tel), User::getTel, tel)
                .orderByDesc(User::getId);

        // 分页查询
        userService.page(userPage, lambda);

        // total 总条数  tableData 当前页数据
        long total = userPage.getTotal();
        List<User> records = userPage.getRecords();

        return ResponseResult.success().data("total", total).data("tableData", records);
    }

    // 添加用户信息
    @PostMapping("add")
    public ResponseResult addUser(@RequestBody User user) {
        // 判定用户名是否存在
        String username = user.getUsername();

        // 构建一个根据用户名查询用户信息的查询条件    where username = 'super'
        LambdaQueryWrapper<User> lambda = new QueryWrapper<User>().lambda();
        lambda.eq(User::getUsername, username);
        User usr = userService.getOne(lambda);

        if (ObjectUtils.isNotNull(usr)) {
            return ResponseResult.fail().message("用户名已存在");
        }

        // 密码加密   MD5摘要算法  不可逆算法
        String md5Pwd = SecureUtil.md5(user.getPassword());
        user.setPassword(md5Pwd);

        // 添加数据到数据库
        userService.save(user);

        return ResponseResult.success();
    }
    // 编辑用户信息
    @PostMapping("edit")
    public ResponseResult editUser(@RequestBody User user) {
        userService.updateById(user);
        return ResponseResult.success();
    }
    // 删除用户信息   路径传参
    @DeleteMapping("delete/{id}")
    public ResponseResult deleteUserById(@PathVariable Integer id) {

        userService.removeById(id);

        return ResponseResult.success();
    }

    // 批量删除用户信息
    @PostMapping("batchDelete")
    public ResponseResult batchDeleteUsers(@RequestBody List<Integer> ids) {

        userService.removeByIds(ids);

        return ResponseResult.success();
    }
}
